package com.vates.gestion.dao;

import java.sql.Date;
import java.util.List;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.vates.entidades.Cliente;
import com.vates.entidades.Hotel;
import com.vates.entidades.Reserva;
import com.vates.entidades.Tipo_Habitacion;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath*:applicationContext.xml")
public class ReservaDAOtest {

	@Autowired
	private BaseDAOReserva<Reserva> ReservaDAO;
	@Autowired
	private BaseDAO<Cliente> clienteDAO;
	@Autowired
	private BaseDAO<Tipo_Habitacion> Tipo_HabitacionDAO;
	@Autowired
	private BaseDAOHotel<Hotel> hotelDAO ;
	
	@Before
	public void setUp() throws Exception {
		Assert.assertNotNull(ReservaDAO);
		Assert.assertNotNull(clienteDAO);
		Assert.assertNotNull(Tipo_HabitacionDAO);
		Assert.assertNotNull(hotelDAO);
	
	}
	
	@Test
	@SuppressWarnings("deprecation")
	public void saveOKTest(){
		Date d = new Date(2012, 12, 12);
		Date d2 = new Date(2012, 12, 13);
		Reserva NuevaReserva = new Reserva();
		NuevaReserva.setCantidad(12);
		NuevaReserva.setFecha_fin(d);
		NuevaReserva.setFecha_inicio(d2);
		
		Cliente c = new Cliente();
		Cliente clientenuevo = clienteDAO.nuevo(c);
		NuevaReserva.setId_cliente(clientenuevo);
		
		Tipo_Habitacion h = new Tipo_Habitacion();
		Tipo_Habitacion nuevaHabitacion = Tipo_HabitacionDAO.nuevo(h);
		NuevaReserva.setId_tipoHabitacion(nuevaHabitacion);
		
		Reserva reservaGuardada = ReservaDAO.nuevo(NuevaReserva);
		Assert.assertTrue(reservaGuardada.getId_reserva() != 0);
	}
	
	@SuppressWarnings("deprecation")
	@Test
	public void buscarPorIdHotelYfechaTest(){
		Date d = new Date(2012,01,01);
		Date d2 = new Date(2012, 01, 30);
		Tipo_Habitacion t = new Tipo_Habitacion();
		t.setId_hotel(hotelDAO.buscarPorId(1));
		Tipo_Habitacion habitacion = Tipo_HabitacionDAO.nuevo(t);
		Assert.assertNotNull(habitacion);

		Reserva r = new Reserva();
		r.setFecha_inicio(d);
		r.setFecha_fin(d2);
		r.setId_tipoHabitacion(habitacion);
		Reserva reservaGuardada = ReservaDAO.nuevo(r);
		Assert.assertNotNull(reservaGuardada);
		
		
		Date d3 = new Date(2012,01,02);
		Date d4 = new Date(2012, 01, 29);
		List<Reserva> reserva = ReservaDAO.buscarPorIdHotelYfecha(1, d3, d4);
		System.out.println(reserva.size());
		Reserva reservaBuscada = reserva.get(reserva.size()-1);
		
		Assert.assertNotNull(reservaBuscada);
		
	}
	
	@SuppressWarnings("deprecation")
	@Test
	public void buscarPorIdClienteYfechaTest(){
		Date d = new Date(2012,01,01);
		Date d2 = new Date(2012, 01, 30);
		
		Cliente c = new Cliente();
		Cliente clienteNuevo = clienteDAO.nuevo(c);
		
		Reserva r = new Reserva();
		r.setFecha_inicio(d);
		r.setFecha_fin(d2);
		r.setId_cliente(clienteNuevo);
		Reserva reservaGuardada = ReservaDAO.nuevo(r);
		Assert.assertNotNull(reservaGuardada);
		
		Date d3 = new Date(2012,01,02);
		Date d4 = new Date(2012, 01, 29);
		List<Reserva> reserva = ReservaDAO.buscarPorIdClienteYfecha(clienteNuevo.getId_cliente(), d3, d4);
		System.out.println(reserva.size());
		Reserva reservaBuscada = reserva.get(reserva.size()-1);
		Assert.assertNotNull(reservaBuscada);
		
	}
	
	@Test
	public void buscarPorIdTest(){
		Reserva reservaNueva = new Reserva();
		Reserva re = ReservaDAO.nuevo(reservaNueva);
		System.out.println(re.getId_reserva() );
		Reserva reserva = ReservaDAO.buscarPorId(re.getId_reserva());
//		Assert.assertNotNull(c);
		Assert.assertEquals(re.getId_reserva(),reserva.getId_reserva());
	}
	
	@Test
	public void eliminarTest(){
		Reserva r = new Reserva();
		Reserva nueva = ReservaDAO.nuevo(r);
		Assert.assertNotNull(nueva);
		ReservaDAO.eliminar(nueva.getId_reserva());
		Assert.assertNull(ReservaDAO.buscarPorId(nueva.getId_reserva()));
	}
	
	@Test
	public void buscarTodosTest(){
		List<Reserva>lista = ReservaDAO.buscarTodos();
		Assert.assertTrue(0 != lista.size());
	}
	
	@Test
	public void modificarTest(){
		
		Reserva reservaNuevo = new Reserva();
		reservaNuevo.setCantidad(1);
		Reserva reservaGuerdada = ReservaDAO.nuevo(reservaNuevo); 
		Assert.assertTrue(reservaGuerdada.getId_reserva() != 0);
		ReservaDAO.modificar(reservaGuerdada);
	}
	
}
